package com.xxxtea.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.xxxtea.common.BaseEnum;
import com.xxxtea.common.UserContext;
import com.xxxtea.common.anno.AutowiredUserId;
import com.xxxtea.config.converter.BaseEnumDeserializer;
import com.xxxtea.mpe.handler.AttachmentHandler;
import com.xxxtea.mpe.model.Attachment;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;

import java.util.Date;

/**
 * 聊天消息实体类
 *
 * 用于存储聊天会话中的消息信息，包括：
 * - 消息基本信息（内容、类型、发送时间等）
 * - 发送者信息（ID、名称、头像等）
 * - 会话关联
 * - 消息类型管理（文字、图片等）
 *
 * 使用MyBatis-Plus注解进行数据库映射
 * 使用Swagger注解进行API文档生成
 * 使用Builder模式构建对象
 *
 * @author badman
 * @since 1.0.0
 */
@Data
@Builder
@ApiModel("聊天消息")
@TableName(autoResultMap = true)
public class ChatMessage {

	/**
	 * 主键ID
	 * 使用自增策略
	 */
	@ApiModelProperty("主键")
	@TableId(value = "id", type = IdType.AUTO)
	private Integer id;

	/**
	 * 会话ID
	 * 关联ChatSession表
	 */
	@ApiModelProperty("会话ID")
	private Integer sessionId;

	/**
	 * 发送用户ID
	 * 自动注入当前用户ID
	 */
	@AutowiredUserId
	@ApiModelProperty("发送用户ID")
	private Integer senderId;

	/**
	 * 发送用户名称
	 */
	@ApiModelProperty("发送用户名称")
	private String name;

	/**
	 * 发送用户头像
	 * 使用自定义处理器处理头像附件
	 */
	@ApiModelProperty("发送用户头像")
	@TableField(typeHandler = AttachmentHandler.class)
	private Attachment avatar;

	/**
	 * 消息内容
	 * 消息的具体内容
	 */
	@ApiModelProperty("消息内容")
	private String content;

	/**
	 * 消息类型
	 * 使用枚举类型管理消息类型
	 */
	@ApiModelProperty("消息类型")
	@JsonDeserialize(using = BaseEnumDeserializer.class)
	private Type type;

	/**
	 * 创建时间
	 * 自动填充插入时间
	 */
	@ApiModelProperty("创建时间")
	@TableField(fill = FieldFill.INSERT)
	private Date createTime;

	/**
	 * 判断消息是否由当前用户发送
	 *
	 * @return true-是当前用户发送 false-不是当前用户发送
	 */
	public boolean isMe() {
		return UserContext.getId().equals(senderId);
	}

	/**
	 * 消息类型枚举
	 * 定义消息的各种类型
	 */
	@Getter
	@AllArgsConstructor
	public enum Type implements BaseEnum<Type> {
		/**
		 * 文字消息
		 */
		TEXT(1, "文字"),
		/**
		 * 图片消息
		 */
		IMAGE(2, "图片"),
		;
		private final Integer value;
		private final String label;
	}

}
